DDL 毫秒级同步,Light Schema Change 的设计与实现|新版本揭秘
在 OLAP 的业务场景中,Schema Change 是一个相对常见的业务需求,当上游数据源维度发生变化时,通常需要将数仓中的表结构进行相应的变更。相对于业界其他 OLAP 数据库,Apache Doris 对 Schema Change 的支持非常友好,可支持 Online Schema Change,进行加减列或修改列类型时无须停服,保证了系统的高可用和业务的平稳运转。
但在部分场景下,Schema Change 也存在一定的瓶颈,例如:在面对大数据量宽表场景下, Schema Change 执行效率相对较低、耗费时间较长;另外基于 Flink 和 Doris 构建实时数仓时,因 Schema Change 是异步作业,一旦上游表发生维度变化,需要自己维护 Schema Change 的执行状态,并在完成后重启 Flink Job,无法做到自动化变更,冗长复杂的操作流程无疑增加了许多开发和运维的成本,且可能会带来消费数据的积压。
在正式介绍之前,需要认识一下 Apache Doris 1.2.0 版本之前支持的 3 种 Schema Change 方式,均是异步作业,分别为:
Hard Linked Schema Change:无需转换数据,直接完成。新摄入的数据都按照新的Schema处理,对于旧数据,新加列的值直接用对应数据类型的默认值填充。例如加列操作 ALTER TABLE site_visit ADD COLUMN click bigint SUM default '0'; Hard Sort Schema Change:改变了列的排序方式,需对数据进行重新排序。例如删除排序列中的一列, 字段重排序 ALTER TABLE site_visit DROP COLUMN city; Hard Direct Schema Change:重刷全量数据,成本最高。当修改列的类型,稀疏索引中加一列时需要按照这种方法进行 ALTER TABLE site_visit MODIFY COLUMN username varchar(64);
Hard Linked Schema Change
创建新的 Tablet。 等待已经开始的导入完成。 将当前已有的数据文件 Hard Link 到新 Tablet 对应的数据目录下。
当集群规模和表数据量达到一定数量时,Hard Linked Schema Change 等待时间就会明显增加。
在 Hard Linked Schema Change 过程中,如果有导入任务,为保证 Schema Change 的事务性,会对新/旧 Tablet 进行双写,Schema Change 则需要等待导入任务完成之后才可以进行。在遇到这种情况时,用户往往只有 2 个选择:一个是等待 Schema Change 完成再进行导入,一个是接受双写的代价,而这两种选择对用户都不太友好。
Hard Linked Schema Change 无法处理 Delete Predicate。如果用户在 Schema Change 之前调用过 Delete 语句,Doris 不会立刻删除数据,而是记一个Rowset,并把 Delete Predicate 和此 Rowset 进行关联;如果在做 Hard Linked Schema Change 过程中,发现 Delete Predicate,则会转化为 Sort/Direct Schema Change 对数据进行重写。
相较于 Hard Linked Schema Change 的作业流程,Apache Doris 1.2.0 新版本的 Light Schema Change 的实现原理就要简单的多,只需要在加减 Value 列的时候,对 FE 中表的元数据进行修改并持久化。在设计过程中,需要考虑到以下实现细节:
解决 Schema 不一致问题
读取数据的时候下发 Schema 。Schema 每一列都有相应的 Unique ID,该 Unique ID 由 BE 的每个 Tablet 负责产生和赋值,但对于所有的 Tablet,其 Schema 列的 Unique ID 都是一致的,因此将此过程移在 FE 上去实现。FE 在生成查询计划时,会把最新的 Schema 附在其中,并一起发给 BE,BE 会拿最新的 Schema 读取数据,以此来解决读过程中 Schema 的不一致。
将 Schema 持久化到 Rowset 的元数据中。FE 在发起导入任务的时候,会把最新的 Schema 一起下发给 BE,BE 会根据最新的 Schema 对数据进行写入并与 Rowset 绑定,将该 Schema 持久化到 Rowset 的元数据之中,实现了 Rowset 数据的自解析,解决了写过程中 Schema 的不一致。
在进行 Compaction 的时候,选取需要进行 Compaction 的 Rowset 中最新的 Schema,作为Compaction 之后 Rowset 所对应的 Schema,以此来解决拥有不同 Schema 的 Rowset 合并问题。
全局 Schema Cache
支持物化视图
Light Schema Change 也实现了对物化视图的支持。对读写流程修改之后,物化视图也可以正常读写。同时,如果要删除的列在物化视图中是 Value 列,则会与主表一起触发 Light Schema Change;如果主表的 Value 列是物化视图中的 Key 列,则需要发起异步任务,对物化视图进行 Sort/Direct Schema Change。
解决数据重写问题
CREATE TABLE IF NOT EXISTS `customer` (
`c_custkey` int(11) NOT NULL COMMENT "",
`c_name` varchar(26) NOT NULL COMMENT "",
`c_address` varchar(41) NOT NULL COMMENT "",
`c_city` varchar(11) NOT NULL COMMENT "",
`c_nation` varchar(16) NOT NULL COMMENT "",
`c_region` varchar(13) NOT NULL COMMENT "",
`c_phone` varchar(16) NOT NULL COMMENT "",
`c_mktsegment` varchar(11) NOT NULL COMMENT ""
)
DUPLICATE KEY(`c_custkey`)
DISTRIBUTED BY HASH(`c_custkey`) BUCKETS 32
PROPERTIES (
"replication_num" = "1",
"light_schema_change" = "true"
);
# 性能对比
无导入任务时
加列:
Hard Linked Schema Change:耗时 1s 310ms。
Light Schema Change:耗时 7ms
减列:
Hard Linked Schema Change:耗时 1s 438ms
Light Schema Change:耗时 3ms
有导入任务时
加列:
Hard Linked Schema Change:耗时 13minutes
Light Schema Change:耗时 3ms
# Flink 结合 Light Schema Change 实现 DDL 同步
基于 Apache Doris 和 Apache Flink 构建实时数仓时,当上游数据源发生表结构变更时,Doris 在同步 DDL 操作时主要有以下痛点:
在发起 Schema Change 后为了避免双写对集群产生的压力,通常会选择阻塞上游数据,在等待 Schema Change 操作执行完成后再解除阻塞,这个时候如果遇到一些数据量特别大的表时,往往会造成 Flink 上游数据积压。
需要自己处理解析 SQL 语句、发起 Schema Change 及维护执行状态等操作。
修改 Schema 后,需要同步修改 Flink 中 Schema 相关的参数并重启 Job。
在 CDC Source 中开启 DDL 变更同步; 在 Doris Sink 中对上游数据进行判断,识别 DDL 操作(Add/Drop Column)并解析; 对 Table 进行校验,判断是否可以进行 Light Schema Change 操作;
对 Table 发起 Schema Change 操作。
# 总结
通过 Light Schema Change ,使得 Apache Doris 在面对上游数据表维度变化时,可以更加快速稳定实现表结构同步,保证系统的高效且平稳运转,具体体现在:
执行效率提升明显,且存在导入任务时效率提升更为显著。Light Schema Change 无需对 Tablet 双写,无需等待导入任务完成。在相同集群下,相较于过去版本,Schema Change 效率从数秒或数分钟提升至数毫秒,极大幅度提升了执行效率。 作业流程更加简单,加减列只需修改 FE 元数据,不需要与 BE 进行交互,实现同步返回,避免较长等待时间,以及因异步长时间执行而可能导致的误操作行为,提升了系统容错性和稳健性。 Flink CDC 结合 Light Schema Change 快速实时同步 DDL ,有效解决了双写以及阻塞数据等问题,避免了增删列需要修改程序且需要停服重启的操作,实现 DDL 毫秒级快速同步,进一步提升了实时数仓数据处理和分析链路的时效性与便捷性。
吴迪:Apache Doris Committer,SelectDB 生态研发工程师。
最后,欢迎更多的开源技术爱好者加入 Apache Doris 社区,携手成长,共建社区生态。Apache Doris 社区当前已容纳了上万名开发者和使用者,承载了 30+ 交流社群,如果你也是 Apache Doris 的爱好者,扫码加入 Apache Doris 社区用户交流群,在这里你可以获得:
专业全职团队技术支持 直接和社区专家交流,获取免费且专业回复 认识不同行业的开发者,收获知识以及合作机会 Apache Doris 最新版本优先体验权 获取一手干货和资讯以及活动优先参与权
▶ Apache Doris 向量化版本在小米A/B实验场景的调优实践
▶ 人群圈选效率提升30倍,Apache Doris云积分的最佳实践